/**
 * @(#)AbstractAdministradorConfiguracion.java 5/04/2010
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 5/04/2010 - 11:42:52 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>5/04/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.configuracion;

import com.psiqueware.alheli.serializacion.SerializadorFactory;
import com.psiqueware.alheli.serializacion.TipoSerializacion;

import java.io.File;
import java.io.Serializable;
import java.util.Locale;

/**
 * Clase base para facilitar los castings a la hora de utilizar el {@link AdministradorConfiguracion}.
 * <br/>Paquete Original: com.psiqueware.alheli.configuracion
 * <br/>Nombre  Original: AbstractAdministradorConfiguracion
 * <br/>Oprima para ver : <a href="AbstractAdministradorConfiguracion.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 5/04/2010 11:42:52 AM
 */
public abstract class AbstractAdministradorConfiguracion implements AdministradorConfiguracion
{


    /**
     * Constructor de AbstractAdministradorConfiguracion.
     */
    public AbstractAdministradorConfiguracion()
    {

    }


    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Boolean valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "false" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Boolean valor)
    {
        configura(contexto, nombre, null == valor ? "false" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Boolean valor)
    {
        configura(nombre, null == valor ? "false" : valor.toString());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Boolean busca(final Long idDominio, final String contexto, final String nombre, final Boolean valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Boolean salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Boolean.parseBoolean(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Boolean busca(final String contexto, final String nombre, final Boolean valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Boolean salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Boolean.parseBoolean(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Boolean busca(final String nombre, final Boolean valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Boolean salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Boolean.parseBoolean(strValor);
        }
        return salida;
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Long valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? new Long(0L).toString() : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Long valor)
    {
        configura(contexto, nombre, null == valor ?new Long(0L).toString() : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Long valor)
    {
        configura(nombre, null == valor ? new Long(0L).toString() : valor.toString());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Long busca(final Long idDominio, final String contexto, final String nombre, final Long valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Long salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Long.parseLong(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Long busca(final String contexto, final String nombre, final Long valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Long salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Long.parseLong(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Long busca(final String nombre, final Long valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Long salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Long.parseLong(strValor);
        }
        return salida;
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Float valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Float valor)
    {
        configura(contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Float valor)
    {
        configura(nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Float busca(final Long idDominio, final String contexto, final String nombre, final Float valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Float salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Float.parseFloat(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Float busca(final String contexto, final String nombre, final Float valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Float salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Float.parseFloat(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Float busca(final String nombre, final Float valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Float salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Float.parseFloat(strValor);
        }
        return salida;
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Double valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Double valor)
    {
        configura(contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Double valor)
    {
        configura(nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Double busca(final Long idDominio, final String contexto, final String nombre, final Double valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Double salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Double.parseDouble(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Double busca(final String contexto, final String nombre, final Double valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Double salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Double.parseDouble(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Double busca(final String nombre, final Double valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Double salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Double.parseDouble(strValor);
        }
        return salida;
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Integer valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Integer valor)
    {
        configura(contexto, nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Integer valor)
    {
        configura(nombre, null == valor ? "0" : valor.toString());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Integer busca(final Long idDominio, final String contexto, final String nombre, final Integer valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Integer salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Integer.parseInt(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Integer busca(final String contexto, final String nombre, final Integer valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Integer salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Integer.parseInt(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Integer busca(final String nombre, final Integer valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Integer salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = Integer.parseInt(strValor);
        }
        return salida;
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Serializable valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "null" : SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).serializar(valor));
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Serializable valor)
    {
        configura(contexto, nombre, null == valor ? "null" : SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).serializar(valor));
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Serializable valor)
    {
        configura(nombre, null == valor ? "null" : SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).serializar(valor));
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Serializable busca(final Long idDominio, final String contexto, final String nombre, final Serializable valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final Serializable salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).objetivizar(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Serializable busca(final String contexto, final String nombre, final Serializable valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final Serializable salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).objetivizar(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Serializable busca(final String nombre, final Serializable valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final Serializable salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = SerializadorFactory.getSerializador(TipoSerializacion.XmlEncoder).objetivizar(strValor);
        }
        return salida;
    }


    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final File valor)
    {
        configura(idDominio, contexto, nombre, null == valor ? "null" : valor.getAbsolutePath());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final File valor)
    {
        configura(contexto, nombre, null == valor ? "null" : valor.getAbsolutePath());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final File valor)
    {
        configura(nombre, null == valor ? "null" : valor.getAbsolutePath());
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public File busca(final Long idDominio, final String contexto, final String nombre, final File valorPorDefecto)
    {
        final String strValor = busca(idDominio, contexto, nombre, (String) null);
        final File salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = new File(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public File busca(final String contexto, final String nombre, final File valorPorDefecto)
    {
        final String strValor = busca(contexto, nombre, (String) null);
        final File salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = new File(strValor);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public File busca(final String nombre, final File valorPorDefecto)
    {
        final String strValor = busca(nombre, (String) null);
        final File salida;
        if (null == strValor)
        {
            salida = valorPorDefecto;
        }
        else if ("null".equals(strValor))
        {
            salida = null;
        }
        else
        {
            salida = new File(strValor);
        }
        return salida;
    }


    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final Locale valor)
    {
        configura(idDominio, contexto, nombre + ".language", null == valor || null == valor.getLanguage() ? "null" : valor.getLanguage());
        configura(idDominio, contexto, nombre + ".country", null == valor || null == valor.getCountry() ? "null" : valor.getCountry());
        configura(idDominio, contexto, nombre + ".variant", null == valor || null == valor.getVariant() ? "null" : valor.getVariant());
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final Locale valor)
    {
        configura(null, contexto, nombre, valor);
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final Locale valor)
    {
        configura(null, null, nombre, valor);
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto. Puede ser <code>null</code>, siendo <code>null</code> un dominio distinto de otros.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Locale busca(final Long idDominio, final String contexto, final String nombre, final Locale valorPorDefecto)
    {
        final String strValorLanguage = busca(idDominio, contexto, nombre + ".language", (String) null);
        final String strValorCountry = busca(idDominio, contexto, nombre + ".country", (String) null);
        final String strValorVariant = busca(idDominio, contexto, nombre + ".variant", (String) null);
        final Locale salida;
        if (null == strValorLanguage || "null".equals(strValorLanguage))
        {
            salida = valorPorDefecto;
        }
        else
        {
            salida = new Locale(strValorLanguage, strValorCountry, strValorVariant);
        }
        return salida;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Locale busca(final String contexto, final String nombre, final Locale valorPorDefecto)
    {
        return busca(null, contexto, nombre, valorPorDefecto);
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public Locale busca(final String nombre, final Locale valorPorDefecto)
    {
        return busca(null, null, nombre, valorPorDefecto);
    }
}

